package com.boge.utils.myutils;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.json.Json;

import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse.SmsSendDetailDTO;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;

/**
 * 发送短信及获取短信信息
 * @author erlang
 *
 */
public class ShortMessageTool {
	public static String product = "Dysmsapi";// 短信API产品名称（短信产品名固定，无需修改
	public static String domain = "dysmsapi.aliyuncs.com";// 短信API产品域名（接口地址固定，无需修改
	/********** 需要准备的参数 **************/
	public static String accessKeyId = "LTAIRJ3lJGeDtHNd";// 需要修改
	public static String accessKeySecret = "NYen9ilqz25SPJzoIDMMMmlM3XXDb7";// 需要修改
	public static String code = "SMS_86525139";// 需要修改
	public static String signName = "博哥哥的ownworld";// 需要修改

	/**
	 * @throws InterruptedException ********************************/

	public static void main(String[] args) throws InterruptedException {
		String phone = "17717037560";
//		System.out.println(sendSms(phone));
        System.out.println(queryLastVerificationCode(phone));
	}
	
	public void test() throws InterruptedException {
		String phone1 = "17621394523";
		String phone = "17717037560";
		Map<String, String> map = new HashMap<String, String>();
		map.put("verificationCode", "111111");
		SendSmsResponse response = sendSms(phone);
		System.out.println("短信接口返回的数据----------------");
        System.out.println("Code=" + response.getCode());
        System.out.println("Message=" + response.getMessage());
        System.out.println("RequestId=" + response.getRequestId());
        System.out.println("BizId=" + response.getBizId());
        
        Thread.sleep(3000L);
        
        //查明细
        QuerySendDetailsResponse querySendDetailsResponse = querySendDetails(phone);
        System.out.println("短信明细查询接口返回数据----------------");
        System.out.println("Code=" + querySendDetailsResponse.getCode());
        System.out.println("Message=" + querySendDetailsResponse.getMessage());
        int i = 0;
        for(QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : querySendDetailsResponse.getSmsSendDetailDTOs()){
            System.out.println("SmsSendDetailDTO["+i+"]:");
            System.err.println("Content=" + smsSendDetailDTO.getContent());
            System.out.println("ErrCode=" + smsSendDetailDTO.getErrCode());
            System.out.println("OutId=" + smsSendDetailDTO.getOutId());
            System.out.println("PhoneNum=" + smsSendDetailDTO.getPhoneNum());
            System.out.println("ReceiveDate=" + smsSendDetailDTO.getReceiveDate());
            System.out.println("SendDate=" + smsSendDetailDTO.getSendDate());
            System.out.println("SendStatus=" + smsSendDetailDTO.getSendStatus());
            System.out.println("Template=" + smsSendDetailDTO.getTemplateCode());
        }
        System.out.println("TotalCount=" + querySendDetailsResponse.getTotalCount());
        System.out.println("RequestId=" + querySendDetailsResponse.getRequestId());
	}

	/**
	 * 发送验证码
	 * @param phone
	 * @return
	 */
	public static SendSmsResponse sendSms(String phone) {
		try {
			// 设置超时时间-可自行调整
			System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
			System.setProperty("sun.net.client.defaultReadTimeout", "10000");
			// 初始化ascClient需要的几个参数
			// 初始化ascClient,暂时不支持多region
			IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou",
					accessKeyId, accessKeySecret);
			DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product,
					domain);
			IAcsClient acsClient = new DefaultAcsClient(profile);
			// 组装请求对象
			SendSmsRequest request = new SendSmsRequest();
			// 使用post提交
			request.setMethod(MethodType.POST);
			// 必填:待发送手机号。支持以逗号分隔的形式进行批量调用，批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
			request.setPhoneNumbers(phone);
			// 必填:短信签名-可在短信控制台中找到
			request.setSignName(signName);
			// 必填:短信模板-可在短信控制台中找到
			request.setTemplateCode(code);
			// 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
			// 友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
			Map<String, String> map = new HashMap<String, String>();
			String code = Utils.getRandNum();
			map.put("verificationCode", code);
			System.out.println("code:" + code);
			request.setTemplateParam(JSONObject.toJSONString(map));
			// 可选-上行短信扩展码(无特殊需求用户请忽略此字段)
			// request.setSmsUpExtendCode("90997");
			// 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
			request.setOutId("yourOutId");
			// 请求失败这里会抛ClientException异常
			SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
			if (sendSmsResponse.getCode() != null
					&& sendSmsResponse.getCode().equals("OK")) {
				// 请求成功
				System.out.println("发送成功");
				System.out.println("短信接口返回的数据----------------");
				System.out.println("Code=" + sendSmsResponse.getCode());
				System.out.println("Message=" + sendSmsResponse.getMessage());
				System.out.println("RequestId="
						+ sendSmsResponse.getRequestId());
				System.out.println("BizId=" + sendSmsResponse.getBizId());
			}
			return sendSmsResponse;
		} catch (Exception e) {
			System.out.println("发送失败");
		}
		return null;
	}
	
	/**
	 * 获取10分钟内的最后一个验证码
	 * @param phone
	 * @return 如果没有，则返回null
	 */
	public static String queryLastVerificationCode(String phone) {
		try {
			// 初始化ascClient
			IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou",
					accessKeyId, accessKeySecret);
			DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product,
					domain);
			IAcsClient acsClient = new DefaultAcsClient(profile);
			// 组装请求对象
			QuerySendDetailsRequest request = new QuerySendDetailsRequest();
			// 必填-号码
			request.setPhoneNumber(phone);
			// 必填-短信发送的日期 支持30天内记录查询（可查其中一天的发送数据），格式yyyyMMdd
			String date = Utils.formatDate(System.currentTimeMillis());
			request.setSendDate(date); 
			// 必填-页大小
			request.setPageSize(10L);
			// 必填-当前页码从1开始计数
			request.setCurrentPage(1L);
			// hint 此处可能会抛出异常，注意catch
			QuerySendDetailsResponse querySendDetailsResponse = acsClient
					.getAcsResponse(request);
			// 获取返回结果
			if (querySendDetailsResponse.getCode() != null
					&& querySendDetailsResponse.getCode().equals("OK")) {
				// 代表请求成功
				System.out.println("获取成功");
				SmsSendDetailDTO dto = querySendDetailsResponse.getSmsSendDetailDTOs().get(0);
				String receivedTime = dto.getReceiveDate();
				DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				Date receivedDate = sdf.parse(receivedTime);
				long seconds = (new Date().getTime() - receivedDate.getTime())/1000;
				System.out.println("seconds:" + seconds);
				String lastCode = null;
				if (seconds <= (10 * 60)) {
					lastCode = Utils.getIntInString(dto.getContent());
				}
				return lastCode;
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}
	
	public static String queryVerificationCode(String phone, String bizId) {
		try {
			// 初始化ascClient
			IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou",
					accessKeyId, accessKeySecret);
			DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product,
					domain);
			IAcsClient acsClient = new DefaultAcsClient(profile);
			// 组装请求对象
			QuerySendDetailsRequest request = new QuerySendDetailsRequest();
			// 必填-号码
			request.setPhoneNumber(phone);
			// 可选-调用发送短信接口时返回的BizId
//			request.setBizId(bizId);
			// 必填-短信发送的日期 支持30天内记录查询（可查其中一天的发送数据），格式yyyyMMdd
			request.setSendDate("20170826"); 
			// 必填-页大小
			request.setPageSize(10L);
			// 必填-当前页码从1开始计数
			request.setCurrentPage(1L);
			// hint 此处可能会抛出异常，注意catch
			QuerySendDetailsResponse querySendDetailsResponse = acsClient
					.getAcsResponse(request);
			// 获取返回结果
			if (querySendDetailsResponse.getCode() != null
					&& querySendDetailsResponse.getCode().equals("OK")) {
				// 代表请求成功
				System.out.println("获取成功");
				SmsSendDetailDTO sendDetailDTO = querySendDetailsResponse.getSmsSendDetailDTOs().get(0);
				String content = sendDetailDTO.getContent();
				String code = Utils.getIntInString(content);
				return code;
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}
	
	public static QuerySendDetailsResponse querySendDetails(String phone) {
		try {
			// 初始化ascClient
			IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou",
					accessKeyId, accessKeySecret);
			DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product,
					domain);
			IAcsClient acsClient = new DefaultAcsClient(profile);
			// 组装请求对象
			QuerySendDetailsRequest request = new QuerySendDetailsRequest();
			// 必填-号码
			request.setPhoneNumber(phone);
			// 必填-短信发送的日期 支持30天内记录查询（可查其中一天的发送数据），格式yyyyMMdd
			String date = Utils.formatDate(System.currentTimeMillis());
			request.setSendDate(date);
			// 必填-页大小
			request.setPageSize(10L);
			// 必填-当前页码从1开始计数
			request.setCurrentPage(1L);
			// hint 此处可能会抛出异常，注意catch
			QuerySendDetailsResponse querySendDetailsResponse = acsClient
					.getAcsResponse(request);
			// 获取返回结果
			if (querySendDetailsResponse.getCode() != null
					&& querySendDetailsResponse.getCode().equals("OK")) {
				// 代表请求成功
				System.out.println("成功");
			}
			return querySendDetailsResponse;
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}
	
	public static QuerySendDetailsResponse querySendDetails(String phone, String bizId) {
		try {
			// 初始化ascClient
			IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou",
					accessKeyId, accessKeySecret);
			DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product,
					domain);
			IAcsClient acsClient = new DefaultAcsClient(profile);
			// 组装请求对象
			QuerySendDetailsRequest request = new QuerySendDetailsRequest();
			// 必填-号码
			request.setPhoneNumber(phone);
			// 可选-调用发送短信接口时返回的BizId
//			request.setBizId(bizId);
			// 必填-短信发送的日期 支持30天内记录查询（可查其中一天的发送数据），格式yyyyMMdd
			String date = Utils.formatDate(System.currentTimeMillis());
			request.setSendDate(date);
			// 必填-页大小
			request.setPageSize(10L);
			// 必填-当前页码从1开始计数
			request.setCurrentPage(1L);
			// hint 此处可能会抛出异常，注意catch
			QuerySendDetailsResponse querySendDetailsResponse = acsClient
					.getAcsResponse(request);
			// 获取返回结果
			if (querySendDetailsResponse.getCode() != null
					&& querySendDetailsResponse.getCode().equals("OK")) {
				// 代表请求成功
				System.out.println("成功");
			}
			return querySendDetailsResponse;
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}
	
}
